#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <cstring>
#include <sys/wait.h>

#define SHM_SIZE 1024

int main()
{
    key_t key;
    int shmid;
    char *data;
    pid_t pid;

    
    // 生成一个唯一的key
    key = ftok("shmfile", 65);
    if (key == -1)
    {
        perror("ftok error");
        return 1;
    }

    // 创建共享内存
    shmid = shmget(key, SHM_SIZE, 0666 | IPC_CREAT);
    if (shmid == -1)
    {
        perror("shmget error");
        return 1;
    }

    // 将共享内存连接到进程地址空间
    data = (char *)shmat(shmid, NULL, 0);
    if (data == (char *)(-1))
    {
        perror("shmat error");
        return 1;
    }

    // 创建子进程
    pid = fork();
    if (pid == -1)
    {
        perror("fork errpr");
        return 1;
    }

    if (pid == 0)
    {
        // 子进程
        std::cout << "Child received: " << data << std::endl;
        shmdt(data); // 分离共享内存
    }
    else
    {
        // 父进程
        strcpy(data, "Hello, Shared Memory!");
        wait(NULL);
        shmdt(data);
        shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
    }

    return 0;
}